#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

#define LEN 100

char buffer[LEN]; // 公共缓冲区

// 写入信息的子线程的执行函数
void *write_thread_run(void *);
// 读取信息的子线程的执行函数
void *read_thread_run(void *);

int main(void){
  pthread_t write_thread; // 写入信息的子线程
  pthread_t read_thread; // 读取信息的子线程

  // 创建写入信息子线程
  pthread_create(&write_thread,NULL,write_thread_run,NULL);
  // 创建读取信息子线程
  pthread_create(&read_thread,NULL,read_thread_run,NULL);

  // 子线程插队，确保子线程能执行成功
  pthread_join(write_thread,NULL);
  pthread_join(read_thread,NULL);

  printf("主线程执行结束，程序退出！\n");
  return 0;
}

/**
 * @brief  写入信息的子线程的执行函数
 * @param  void *指针类型的参数
 * @return void *指针类型的返回值
 */
void *write_thread_run(void *){
  int i=0;
  char c=0;
  while (1)  {
    c = fgetc(stdin); // 从控制台获取一个字符
    if(c&&c!='\n'){
      buffer[i++]=c;
      if(c=='q'){
        break;
      }
      // 防止越界
      if(i>=LEN){
        i=0; // 从头开始
      }      
    }    
  }  
}

/**
 * @brief  读取信息的子线程的执行函数
 * @param  void *指针类型的参数
 * @return void *指针类型的返回值
 */
void *read_thread_run(void *){
  int i=0;
  char c=0;
  while(1){
    c=buffer[i];
    if(c){ // 当前缓冲区位置有数据
      printf("%c\n",c);
      if(c=='q') break;
      // 清理当前读过的数据
      buffer[i++]=0;
      // 防止越界
      if(i>=LEN){
        i=0; // 从头开始
      }
    }else{
      sleep(1); // 没有读取到数据，可以先等等，等写线程先写数据
    }      
  }  
}

